﻿Imports System.ComponentModel
Imports System.Windows.Interop
Imports System.Net
Imports Orekaria.Lib.P2P
Imports System.Windows.Threading
Imports Orekaria.Lib.Win32

Public Class FrmTablero
    Private ReadOnly _host As HostHelper
    Private _terminado As Boolean = False
    Dim _tablero As Tablero
    Private _tamañoVoxel As Integer
    Private ReadOnly _isInicializando As Boolean = True
    Private _posicion As Point
    Private _marcador As String = ""

    Public Sub New(ByVal host As HostHelper)
        InitializeComponent()

        _posicion = New Point(-1, -1)
        _picFondo.Size = New Size(10, 10)
        _host = host
        _isInicializando = False
    End Sub

    Private Sub FrmTableroLoad(sender As Object, e As EventArgs) Handles MyBase.Load
        EscribirTitulo()
    End Sub

    Private Sub FrmTableroShown(sender As Object, e As EventArgs) Handles Me.Shown
        InicializarTablero()
    End Sub

    Public Sub Ola()
        EscribirTitulo()

        ' recoge los mensajes pendientes dirigidos a este host y procésalos
        Dim mb = _host.DequeueMensaje()
        If Not mb Is Nothing Then
            Select Case mb.Tipo
                Case TipoMensaje.Disparo
                    DisparoEn(mb.Posicion)
                Case TipoMensaje.ImpactoAgua
                    _tablero.ImpactoEnAgua(mb.Posicion)
                    ActualizarInformación()
                Case TipoMensaje.ImpactoBarco
                    _tablero.ImpactoEnBarco(mb.Posicion, mb.IDBarco, mb.Orientación, mb.TipoBarco, mb.SubParteBarco)
                    ActualizarInformación()
                    '_tablero.ProcesaInfoImpacto()
                Case Else
                    Throw New NotImplementedException("Esto no debería suceder. Comprueba.")
            End Select
        End If

        ' notifica a través del borde
        If _terminado Then
            _pnlContenedor.BackColor = Color.IndianRed
        Else
            If P2PEncapsulado.ElTurnoLoTiene Is Nothing Then
                _pnlContenedor.BackColor = Color.LightSteelBlue
                'Me.BackColor = System.Drawing.SystemColors.Control
            Else
                If P2PEncapsulado.ElTurnoLoTiene = _host Then
                    _pnlContenedor.BackColor = Color.DodgerBlue
                    'Me.BackColor = System.Drawing.SystemColors.ActiveCaption
                Else
                    _pnlContenedor.BackColor = Color.LightSteelBlue
                    'Me.BackColor = System.Drawing.SystemColors.Control
                End If
            End If
        End If
    End Sub

    Private Sub EscribirTitulo()
        Text = String.Format("{0}", _host.UserName)
        If _host <> P2PEncapsulado.HostPropio Then
            Text += String.Format(" - {0}", _host.DateOfLastMessage.ToLongTimeString())
        End If
        Text += IIf(String.IsNullOrEmpty(_marcador), String.Empty, " - " + _marcador)
        Text += IIf(_terminado, " - Owned!!", "")

#If DEBUG Then
        Dim mb = _host.PreviewMensaje()
        If Not mb Is Nothing Then
            Text += " / " + mb.ToString()
        End If
#End If
    End Sub

    Private Sub InicializarTablero()
        _terminado = False
        _picFondo.Controls.Clear()
        _picFondo.Enabled = True
        _tablero = New Tablero(_host)
        If P2PEncapsulado.HostPropio = _host Then
#If Not Debug Then
            Enabled = False
#End If
            ' MuestraLosBarcos()
        End If
        ActualizarInformación()
    End Sub

    Private Sub MuestraLosBarcos()
        For x As Integer = 0 To Ancho - 1
            For y As Integer = 0 To Alto - 1
                Dim c As Casilla = _tablero.GetInfoCasilla(New Point(x, y))
                If c.HayBarco Then
                    Dim p As Point = ConvierteCasillaAVoxel(c.Posición)
                    Dim pb As New PictureBox
                    pb.Location = p
                    pb.Size = New Size(_tamañoVoxel, _tamañoVoxel)
                    c.Muestralo(pb)
                    AddHandler pb.Click, AddressOf RemovePickAndClick
                    _picFondo.Controls.Add(pb)
                End If
            Next
        Next
    End Sub

    <Conditional("DEBUG")>
    Private Sub RemovePickAndClick(ByVal sender As PictureBox, ByVal e As EventArgs)
        _picFondo.Controls.Remove(sender)
        PicFondoClick(sender, e)
    End Sub

    Private Sub FrmTableroResize(sender As Object, e As EventArgs) Handles Me.Resize
        ' Ajusta el tamaño del tablero
        Dim lado = IIf(_pnlContenedor.Size.Width < _pnlContenedor.Height, _pnlContenedor.Width, _pnlContenedor.Height)
        _tamañoVoxel = lado \ 10
        Dim margen = lado - _tamañoVoxel * 10
        _picFondo.Size = New Size(_tamañoVoxel * 10, _tamañoVoxel * 10)
        _picFondo.Location = New Point(margen, margen)

        If Not _isInicializando Then
            'Debug.Print(_host.userName + ", " + Me.Size.ToString() + "," + Me.Location.ToString)
            FormBorderStyle = FormBorderStyle.FixedToolWindow
            _posicion = Location
        End If

        ' TODO: Redibuja el tablero

    End Sub

    Private Sub ActualizarInformación()
        Dim a As Ábaco = _tablero.DameElÁbaco
        'lblPorcentajeAciertos.Text = a.PorcentajeAciertos
        'pbxUno.Image = ImagenDeResources(TipoBarco.UnaCasilla, a.EsHundidos(TipoBarco.UnaCasilla))
        'pbxDos.Image = ImagenDeResources(TipoBarco.DosCasillas, a.EsHundidos(TipoBarco.DosCasillas))
        'pbxTres.Image = ImagenDeResources(TipoBarco.TresCasillas, a.EsHundidos(TipoBarco.TresCasillas))
        'pbxCuatro.Image = ImagenDeResources(TipoBarco.CuatroCasillas, a.EsHundidos(TipoBarco.CuatroCasillas))
        'lblTipoUna.Text = HundidosFlotando(a.CantidadDeBarcosHundidos(TipoBarco.UnaCasilla), a.CantidadDeBarcos(TipoBarco.UnaCasilla))
        'lblTipoDos.Text = HundidosFlotando(a.CantidadDeBarcosHundidos(TipoBarco.DosCasillas), a.CantidadDeBarcos(TipoBarco.DosCasillas))
        'lblTipoTres.Text = HundidosFlotando(a.CantidadDeBarcosHundidos(TipoBarco.TresCasillas), a.CantidadDeBarcos(TipoBarco.TresCasillas))
        'lblTipoCuatro.Text = HundidosFlotando(a.CantidadDeBarcosHundidos(TipoBarco.CuatroCasillas), a.CantidadDeBarcos(TipoBarco.CuatroCasillas))

        _marcador = String.Format("Barcos: {0}/{1}/{2}/{3} Disparos: {4}", a.CantidadDeBarcosAFlote(TipoBarco.UnaCasilla), a.CantidadDeBarcosAFlote(TipoBarco.DosCasillas), a.CantidadDeBarcosAFlote(TipoBarco.TresCasillas), a.CantidadDeBarcosAFlote(TipoBarco.CuatroCasillas), a.Disparos)

        ' Comprueba si ha ganado
        If a.EsTodosHundidos() Then
            _terminado = True
            _picFondo.Enabled = False
            _marcador = String.Format("Disparos: {0}", a.Disparos)
        End If

        EscribirTitulo()
    End Sub

    Private Sub PicFondoClick(ByVal sender As Object, ByVal e As EventArgs) Handles _picFondo.Click
        Dim p = IdentificaCasillaDelMouse()
        _tablero.EnviaDisparo(p)
        ' DisparoEn(p) ' ponerlo aquí mejora la respuesta local pero no sirve para los turnos
    End Sub

    Private Sub DisparoEn(ByVal p As Point)
        If Not _tablero.EsElementoUIAsociadoConCasilla(p) Then
            Dim pb = New PictureBox
            pb.Size = New Size(_tamañoVoxel, _tamañoVoxel)
            pb.Location = ConvierteCasillaAVoxel(p)
            pb.BackgroundImageLayout = ImageLayout.Zoom
            pb.BackgroundImage = ImagenDeResources("consultando")
            _picFondo.Controls.Add(pb)
            _tablero.AsociaElementoUI(p, pb)
            _tablero.EnviaInfoImpacto(p)
        End If
    End Sub

    Private Function IdentificaCasillaDelMouse() As Point
        Dim x, y As Integer
        x = _picFondo.PointToClient(Cursor.Position).X \ _tamañoVoxel
        y = _picFondo.PointToClient(Cursor.Position).Y \ _tamañoVoxel
        Return New Point(x, y)
    End Function

    Private Function ConvierteCasillaAVoxel(ByVal p As Point) As Point
        Return New Point(p.X * _tamañoVoxel, p.Y * _tamañoVoxel)
    End Function

    Private Sub FrmTableroLocationChanged(sender As Object, e As EventArgs) Handles MyBase.LocationChanged
        If _posicion.X > -1 Then
            Location = _posicion
        End If
    End Sub

End Class